AWS Lambda の料金と SnapStart の料金の計算方法を整理してみた
AWS Lambda SnapStartがPythonと.NETでも利用可能になりました。
- Python および .NET 関数向けの AWS Lambda SnapStart の一般提供を開始 | Amazon Web Services ブログ
- 【アップデート】Pythonと.NETでもSnapStartが利用可能になりました!! | DevelopersIO
仕事ではPythonを使っているので「来たか!」となったのですが、「料金ってどのぐらいになるんだろう?」と気になりました。
というわけで試算をするために、まずは、計算方法を整理してみました。
おすすめの方
- AWS Lambdaの料金を知りたい方
- AWS Lambda SnapStartの料金を知りたい方
本記事における試算の前提
- 1ヶ月=31日の料金を試算します
- アーキテクチャは、x86とします
- 最初の60億GB秒/月の金額を利用します
- 東京リージョンとします
- SnapStart以外の機能は利用しません
- SnapStartで利用するLambdaのバージョンは1つのみ
- SnapStartが動くリクエストの割合(コールドスタートの割合)は、1%とします
- 無料利用枠は、無しとします
- 2024年12月時点の料金です
- SnapStartによるソフトウェア更新の自動適用の課金(コンピューティング料金)は無視します
Lambda は、回復性のためにスナップショットのキャッシュされたコピーを維持し、ランタイムアップグレードやセキュリティパッチなどのソフトウェア更新を自動的に適用します。Lambda がソフトウェア更新を適用するために初期化コードを再実行すると、そのたびに料金が発生します。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/snapstart.html#snapstart-pricing
結論(計算式のみ)
上記前提のうえで、次の計算式です。
項目 | 計算式 |
---|---|
リクエスト料金 | Lambda実行回数 / 100万 * 0.2 USD |
コンピューティング料金 | 1ヶ月の実行回数 * 1回あたりの実行時間 * メモリ割り当て / 1024 * 0.0000166667 USD |
SnapStart(キャッシュの料金) | 3600 * 24 * 31 * メモリ割り当て / 1024 * 0.0000015046 USD |
SnapStart(リストアの料金) | 1ヶ月の実行回数 * SnapStartが動くリクエストの割合 * メモリ割り当て / 1024 * 0.0001397998 USD |
「SnapStartが動くリクエストの割合」は、つまり、「コールドスタートの割合」です。
具体的なLambdaが存在する場合は、次の方法で調査できます。
以下、具体的な計算方法です。
Lambdaの料金の計算方法
Lambdaの基本料金は、主に2つの要素で決まります。
- リクエスト料金
- コンピューティング料金
上記に加えて、他の機能を利用した場合に追加料金が発生します。
- エフェメラルストレージの料金
- Provisioned Concurrencyの料金
- SnapStartの料金
- Lambda HTTP応答ストリームの料金
- データ転送およびその他の料金
リクエスト料金の計算について
リクエスト料金は単純ですね。次の計算式です。
Lambda実行回数 / 100万 * 0.2 USD
1ヶ月におけるLambda実行回数が「7,440,000」のとき、リクエスト料金は「約 1.49 USD」です。
7,440,000 / 1,000,000 * 0.2 = 1.488
コンピューティング料金の計算について
コンピューティング料金は、すこし複雑です。「1GB-s あたり 0.0000166667 USD」です。
「1GB-s」は、「メモリ割り当てが1GBのLambdaを1秒実行した際の料金」です。
つまり、計算には「Lambdaの実行時間(メモリ割り当てを考慮する)」が必要です。
ちなみに、Lambdaの実行時間は、コンピューティング時間と呼ばれています。
コンピューティング時間に対する課金は1ミリ秒ごとに発生します。
コンピューティング時間を計算する
コンピューティング時間は、メモリ割り当てを考慮するか否かの2種類があります。
- コンピューティング時間 [s](メモリ割り当てを考慮していない)
- コンピューティング時間 [GB-s](メモリ割り当てを考慮する)
分かりやすいように、まずは「コンピューティング時間(メモリ割り当てを考慮していない)」を計算します。
コンピューティング時間(メモリ割り当てを考慮していない)を計算する
今回は、次の条件とします。
項目 | 値 |
---|---|
1ヶ月の実行回数 | 7,440,000 |
1回あたりの実行時間 [s] | 2 |
次の計算式です。
1ヶ月の実行回数 * 1回あたりの実行時間
つまり、1ヶ月のコンピューティング時間(メモリ割り当てを考慮していない)は、「14,880,000 [s]」です。
7,440,000 * 2 = 14,880,000
コンピューティング時間(メモリ割り当てを考慮する)
続いて、コンピューティング時間(メモリ割り当てを考慮する)を計算します。
今回は、次の条件とします。
項目 | 値 |
---|---|
メモリ割り当て [MB] | 1024 |
次の計算式です。
コンピューティング時間(メモリ割り当てを考慮していない) * メモリ割り当て / 1024
つまり、1ヶ月のコンピューティング時間(メモリ割り当てを考慮する)は、「14,880,000 [GB-s]」です。
14,880,000 * 1024 / 1024 = 14,880,000
コンピューティング料金を計算する
最後に、「コンピューティング時間(メモリ割り当てを考慮する)」に対して、「1GB-sあたりの料金」を掛け算します。
次の計算式です。
1ヶ月のコンピューティング時間(メモリ割り当てを考慮する) * 1GB-sあたりの料金 USD
1ヶ月のコンピューティング時間(メモリ割り当てを考慮する)が「14,880,000 [GB-s]」のとき、コンピューティング料金は「約 248 USD」です。
14,880,000 * 0.0000166667 = 248.000496
SnapStartの料金について
SnapStartは、2つの料金があります。
- キャッシュの料金
- リストアの料金
SnapStartのキャッシュの料金について
メモリを1GB割り当てたLambdaのスナップショットを1秒維持するために $0.0000015046 の課金が発生します。
https://dev.classmethod.jp/articles/snap-start-support-python-and-dotnet/
つまり、「SnapStart キャッシュの合計使用量」に対して、「0.0000015046 USD」を掛け算します。
SnapStart キャッシュの合計使用量
今回は、次の条件とします。
項目 | 値 |
---|---|
メモリ割り当て [MB] | 1024 |
SnapStartが有効になっているLambda関数バージョンがアクティブな時間 | 1ヶ月 |
次の計算式です。
SnapStartが有効になっているLambda関数バージョンがアクティブな時間 * メモリ割り当て / 1024
SnapStart キャッシュの合計使用量は、「2,678,400 GB-s」です。
3600s * 24h * 31days * 1024 / 1024 = 2,678,400
SnapStartのキャッシュの料金を計算する
次の計算式です。
SnapStart キャッシュの合計使用量 * 0.0000015046 USD
SnapStart キャッシュの合計使用量が「2,678,400 GB-s」のとき、SnapStartのキャッシュの料金は「約 4.03 USD」です。
2,678,400 * 0.0000015046 = 4.02992064
SnapStartのリストアの料金について
メモリを1GB割り当てたLambdaのスナップショットを1回リストアするごとに $0.0001397998 の課金が発生します。
https://dev.classmethod.jp/articles/snap-start-support-python-and-dotnet/
つまり、「SnapStart リストアの総使用量」に対して、「0.0001397998 USD」を掛け算します。
「SnapStart リストアの総使用量」は、「SnapStart リストアを使用するリクエスト数」から計算できます。
SnapStart リストアを使用するリクエスト数
つまり、今までコールドスタートしていた回数です。
今回は、次の条件とします。
項目 | 値 |
---|---|
1ヶ月の実行回数 | 7,440,000 |
コールドスタートの割合 | 1% |
次の計算式です。
1ヶ月の実行回数 * コールドスタートの割合
SnapStart リストアを使用するリクエスト数は、「74,400」です。
7,440,000 * 1 / 100
SnapStart リストアの総使用量
今回は、次の条件とします。
項目 | 値 |
---|---|
メモリ割り当て [MB] | 1024 |
次の計算式です。
SnapStart リストアを使用するリクエスト数 * メモリ割り当て / 1024
SnapStart リストアを使用するリクエスト数が「74,400」のとき、SnapStart リストアの総使用量は「74,400 GB」です。
74,400 * 1024 / 1024 = 74,400 GB
SnapStartのリストアの料金を計算する
次の計算式です。
SnapStart リストアの総使用量 * 0.0001397998 USD
SnapStart リストアの総使用量が「74,400 GB」のとき、SnapStartのリストアの料金は「約 10.4 USD」です。
74,400 GB * 0.0001397998 = 10.40110512 USD
合計月額料金
下記の合計です。
項目 | 料金 [USD] |
---|---|
リクエスト料金 | 1.49 |
コンピューティング料金 | 248 |
SnapStart(キャッシュの料金) | 4.03 |
SnapStart(リストアの料金) | 10.4 |
合計 | 263.92 |
さいごに
AWS Lambda の料金と SnapStart の料金の計算方法を整理してみました。
本記事の前提にした数値は、AWS公式の料金例と同じです。
2つの内容を見比べると、理解が進むかもしれません。
参考
- Python および .NET 関数向けの AWS Lambda SnapStart の一般提供を開始 | Amazon Web Services ブログ
- 【アップデート】Pythonと.NETでもSnapStartが利用可能になりました!! | DevelopersIO
- [レポート] Accelerate Python and .NET Lambda functions with SnapStartに参加しました #AWSreInvent #SVS218-NEW | DevelopersIO
- 料金 - AWS Lambda |AWS
- CloudWatch Logs Insights で、 Lambda の実行回数とコールドスタート回数を調べる | DevelopersIO